package peace.gui.manage
{
import flash.display.DisplayObject;
import flash.display.InteractiveObject;
import flash.display.Stage;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.ui.Mouse;

import peace.util.Logger;
	
/**
 * Инструмент для управления кастомными курсорами  
 */	
public class Cursors
{
	private static var c:DisplayObject;
	private static var s:Stage;
	private static var cShift:Point;
	
	/**
	 * Задаем пользовательский курсор мыши
	 *  
	 * @param cursor курсор мыши
	 * @param stage
	 * @param shift смещение относительно 0,0 (для возможности таскать курсор за центр и т.п.)
	 * 
	 */	
	public static function setCursor (cursor:DisplayObject, stage:Stage, shift:Point = null):void
	{
		if (!cursor || !stage)
		{
			Logger.error("Cursors::setCursor", "передали не валидные параметры");
			return;
		}
		
		if (c)
		{
			defaultCursor();
		}
		
		c = cursor;
		if (c is InteractiveObject)
		{
			InteractiveObject(c).mouseEnabled = false;
		}
		
		s = stage;
		cShift = shift;
		
		s.addEventListener(Event.ADDED, onStageAddedChild);
		s.addEventListener(Event.MOUSE_LEAVE, onMouseLeave);
		s.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
		
		s.addChild(c);
		onMouseMove(null);

		Mouse.hide();
	}
	/**
	 * Возвращаем текущий курсор или null 
	 * @return  текущий курсор или null 
	 * 
	 */	
	public static function getCursor ():DisplayObject
	{
		return c;
	}
	/**
	 * Возвращаем курсор по умолчанию 
	 * 
	 */	
	public static function defaultCursor ():void
	{
		if (c && s && s.contains(c))
		{
			s.removeChild(c);
			
			s.removeEventListener(Event.ADDED, onStageAddedChild)
			s.removeEventListener(Event.MOUSE_LEAVE, onMouseLeave)
			s.removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove)
			
			c = null;
			cShift = null;
		}
		
		Mouse.show();
	}
	/**
	 * При добавлении на сцену новой хрени курсор должен всплывать наверх 
	 * 
	 */	
	private static function onStageAddedChild (e:Event):void
	{
		s.setChildIndex(c, s.numChildren-1);
	}
	/**
	 * 
	 * @param e
	 * 
	 */	
	private static function onMouseMove (e:MouseEvent):void
	{
		if (!c.visible)
		{
			c.visible = s.mouseX >= 0 && s.mouseX <= s.stageWidth
						&& s.mouseY >= 0 && s.mouseY <= s.stageHeight;
			
			if (!c.visible) return;
		}
		
		c.x = cShift ? s.mouseX + cShift.x : s.mouseX;
		c.y = cShift ? s.mouseY + cShift.y : s.mouseY;
		
		if (e)
		{
			e.updateAfterEvent();
		}
	}
	/**
	 * 
	 * @param e
	 * 
	 */	
	private static function onMouseLeave (e:Event):void
	{
		c.visible = false;
	}
	
	
}

}